package sv.com.globalsolutionslt.manejador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import javax.faces.event.ValueChangeEvent;
import sv.com.globalsolutionslt.controlador.ContactoEntidadFacade;
import sv.com.globalsolutionslt.controlador.DepartamentoFacade;
import sv.com.globalsolutionslt.controlador.DireccionFacade;
import sv.com.globalsolutionslt.controlador.MunicipioFacade;
import sv.com.globalsolutionslt.entidades.ContactoEntidad;
import sv.com.globalsolutionslt.entidades.Departamento;
import sv.com.globalsolutionslt.entidades.Direccion;
import sv.com.globalsolutionslt.entidades.Municipio;
import sv.com.globalsolutionslt.entidades.Pais;
import sv.com.globalsolutionslt.manejador.util.JsfUtil;

@ManagedBean
@SessionScoped
public class ActualizarInfEmpresaMB implements Serializable {

    @EJB
    private ContactoEntidadFacade contactoEntidadFacade;
    @EJB
    private DireccionFacade direccionFacade;
    @EJB
    private DepartamentoFacade departamentoFacade;
    @EJB
    private MunicipioFacade municipioFacade;

    private List departamentos;
    private List municipios;
    private Direccion direccion;
    private Pais paisSeleccionado;
    private Departamento departamentoSeleccionado;
    private Municipio municipioSeleccionado;
    private ContactoEntidad contactoEntidad;
    private List<Direccion> direcciones;
    private List<ContactoEntidad> contactoEntidades;

    @ManagedProperty(value = "#{usuarioSesionMB}")
    private UsuarioSesionMB usuarioSesionMB;

    public ActualizarInfEmpresaMB() {
        direccion = new Direccion();
        direcciones = new ArrayList<>();
        contactoEntidad = new ContactoEntidad();
        contactoEntidades = new ArrayList<>();
        contactoEntidadFacade = new ContactoEntidadFacade();
    }

    //////////////////////////////////////// DIRECION //////////////////////////////////////////////
    
    public List<Direccion> getDirecciones() {
        direcciones = direccionFacade.obtenerTodos();
        return direcciones;
    }

    public void guardarEmpresaDireccion() {
        try {
            getDireccion().setIdEmpresa(usuarioSesionMB.getUsuario().getEmpresaList().get(0));
            getDireccion().setIdMunicipio(this.municipioSeleccionado);
            this.direccionFacade.modificar(direccion);
            setDireccion(new Direccion());
            JsfUtil.agregarMensajeExitoso("Su perfil ha sido actualizado exitosamente");

        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.agregarMensajeError(e, JsfUtil.MENSAJE_ERROR_DEFECTO);
        }

    }

    public void cargarDepartamentos(ValueChangeEvent ev) {
        Pais p = (Pais) ev.getNewValue();
        System.out.println("Cargando Departamentos en base al id pais " + p);
        setDepartamentos(departamentoFacade.obtenerDepartamentosPorPais(p.getIdPais()));
    }

    public void cargarMunicipios(ValueChangeEvent ev) {
        System.out.println("Ingresando al metodo municipio");
        Departamento d = (Departamento) ev.getNewValue();
        System.out.println("Cargando Municipio en base al id departamento " + d);
        setMunicipios(municipioFacade.obtenerMunicipiosPorDepartamento(d.getIdDepartamento()));
    }

    public void actualizarEmpresaDireccion(Direccion modDireccion) {
        try {
            this.direccion = modDireccion;
            this.municipioSeleccionado = modDireccion.getIdMunicipio();
            this.departamentoSeleccionado = this.municipioSeleccionado.getIdDepartamento();
            this.paisSeleccionado = this.departamentoSeleccionado.getIdPais();
            
            
        } catch (Exception e) {
            JsfUtil.agregarMensajeError(e, JsfUtil.MENSAJE_ERROR_DEFECTO);
        }
    }

    public void eliminarEmpresaDireccion(Direccion eliDireccion) {
        try {
            direccionFacade.remover(eliDireccion);
        } catch (Exception e) {
            JsfUtil.agregarMensajeError(e, JsfUtil.MENSAJE_ERROR_DEFECTO);
        }
    }

    ///////////////////////////////////////// CONTACTO ENTIDAD //////////////////////////////////////////////
    
    public List<ContactoEntidad> getContactoEntidades() {
        contactoEntidades = contactoEntidadFacade.obtenerTodosActivos();
        return contactoEntidades;
    }

    public void guardarEmpresaContacto() {
        try {
            getContactoEntidad().setFechaMod(Calendar.getInstance().getTime());
            getContactoEntidad().setIdEmpresa(this.usuarioSesionMB.getEmpresa());
            getContactoEntidad().setActivo(true);
            contactoEntidadFacade.modificar(contactoEntidad);
            setContactoEntidad(new ContactoEntidad());
        } catch (Exception e) {
            JsfUtil.agregarMensajeError(e, JsfUtil.MENSAJE_ERROR_DEFECTO);
        }
    }

    public void actualizarEmpresaContacto(ContactoEntidad modContactoEntidad) {
        try {
            this.contactoEntidad = modContactoEntidad;
        } catch (Exception e) {
            JsfUtil.agregarMensajeError(e, JsfUtil.MENSAJE_ERROR_DEFECTO);
        }
    }

    public void eliminarEmpresaContacto(ContactoEntidad eliContactoEntidad) {
        try {
            eliContactoEntidad.setActivo(false);
            contactoEntidadFacade.modificar(eliContactoEntidad);
        } catch (Exception e) {
            JsfUtil.agregarMensajeError(e, JsfUtil.MENSAJE_ERROR_DEFECTO);
        }
    }
    
    public void crearNuevaInstanciaContacto(){
        this.contactoEntidad= new ContactoEntidad();
    }
    
    
    public void crearNuevaInstanciaDireccion(){
        this.direccion = new Direccion();
        this.paisSeleccionado = null;
        this.departamentoSeleccionado = null;
        this.municipioSeleccionado = null;
    }

    /**
     * ******************** Getter and Setters ***********************
     */
    public ContactoEntidad getContactoEntidad() {
        return contactoEntidad;
    }

    public void setContactoEntidad(ContactoEntidad contactoEntidad) {
        this.contactoEntidad = contactoEntidad;
    }

    public Direccion getDireccion() {
        return direccion;
    }

    public void setDireccion(Direccion direccion) {
        this.direccion = direccion;
    }

    public UsuarioSesionMB getUsuarioSesionMB() {
        return usuarioSesionMB;
    }

    public void setUsuarioSesionMB(UsuarioSesionMB usuarioSesionMB) {
        this.usuarioSesionMB = usuarioSesionMB;
    }

    public List getDepartamentos() {
        return departamentos;
    }

    public void setDepartamentos(List departamentos) {
        this.departamentos = departamentos;
    }

    public List getMunicipios() {
        return municipios;
    }

    public void setMunicipios(List municipios) {
        this.municipios = municipios;
    }

    public Pais getPaisSeleccionado() {
        return paisSeleccionado;
    }

    public void setPaisSeleccionado(Pais paisSeleccionado) {
        this.paisSeleccionado = paisSeleccionado;
    }

    public Departamento getDepartamentoSeleccionado() {
        return departamentoSeleccionado;
    }

    public void setDepartamentoSeleccionado(Departamento departamentoSeleccionado) {
        this.departamentoSeleccionado = departamentoSeleccionado;
    }

    public Municipio getMunicipioSeleccionado() {
        return municipioSeleccionado;
    }

    public void setMunicipioSeleccionado(Municipio municipioSeleccionado) {
        this.municipioSeleccionado = municipioSeleccionado;
    }

}
